// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Author: wsfuyibing <682805@qq.com>
// Date: 2024-07-25

package gen_annotation

import (
	"gitee.com/go-libs/console"
	"gitee.com/go-wares/framework-iris/framework/src/commands"
)

const (
	Description = "Build annotation files for middleware, crontab, controller etc"
	Name        = "gen:annotation"

	OptAnnotationPath             = "annotation-path"
	OptAnnotationPathDesc         = "Generated files will be saved to"
	OptAnnotationPathShort        = 'a'
	OptAnnotationPathDefaultValue = "app/http/annotations"

	OptControllerPath             = "controller-path"
	OptControllerPathDesc         = "Controller files location"
	OptControllerPathShort        = 'c'
	OptControllerPathDefaultValue = "app/http/controllers"

	OptCrontabPath             = "crontab-path"
	OptCrontabPathDesc         = "Crontab files location"
	OptCrontabPathShort        = 'r'
	OptCrontabPathDefaultValue = "app/http/crontabs"

	OptHandlerPath             = "handler-path"
	OptHandlerPathDesc         = "Handler files location"
	OptHandlerPathShort        = 'h'
	OptHandlerPathDefaultValue = "app/http/handlers"

	OptMiddlewarePath             = "middleware-path"
	OptMiddlewarePathDesc         = "Middleware files location"
	OptMiddlewarePathShort        = 'm'
	OptMiddlewarePathDefaultValue = "app/http/middlewares"

	OptOverride     = "override"
	OptOverrideDesc = "Override existed file, Do nothing if not specified"

	OptWorkingDir             = "working-dir"
	OptWorkingDirShort        = 'w'
	OptWorkingDirDesc         = "Current working dir is"
	OptWorkingDirDefaultValue = "./"
)

// New
// creates a command for console.
//
// You can run `go run main.go gen:annotation` to run this command.
func New() *console.Command {
	var (
		p = (&Provider{}).init()
		c = console.NewCommand(Name).SetDescription(Description)
	)
	// Add command options.
	c.Add(
		// Annotation files location.
		console.NewOption(OptAnnotationPath).SetShortName(OptAnnotationPathShort).
			SetDescription(OptAnnotationPathDesc).
			SetDefaultValue(OptAnnotationPathDefaultValue),
		// Controller files location.
		console.NewOption(OptControllerPath).SetShortName(OptControllerPathShort).
			SetDescription(OptControllerPathDesc).
			SetDefaultValue(OptControllerPathDefaultValue),
		// Crontab files location.
		console.NewOption(OptCrontabPath).SetShortName(OptCrontabPathShort).
			SetDescription(OptCrontabPathDesc).
			SetDefaultValue(OptCrontabPathDefaultValue),
		// Handler files location.
		console.NewOption(OptHandlerPath).SetShortName(OptHandlerPathShort).
			SetDescription(OptHandlerPathDesc).
			SetDefaultValue(OptHandlerPathDefaultValue),
		// Middleware files location.
		console.NewOption(OptMiddlewarePath).SetShortName(OptMiddlewarePathShort).
			SetDescription(OptMiddlewarePathDesc).
			SetDefaultValue(OptMiddlewarePathDefaultValue),
		// Override existed files.
		console.NewNullOption(OptOverride).
			SetDescription(OptOverrideDesc),
		// Working directory.
		console.NewOption(OptWorkingDir).SetShortName(OptWorkingDirShort).
			SetDescription(OptWorkingDirDesc+" "+(&commands.Common{}).WorkingDir(OptWorkingDirDefaultValue)).
			SetDefaultValue(OptWorkingDirDefaultValue),
	)
	return c.SetProvider(p)
}
